# ***************第1题：基本概念***************

# 什么是Document String？
# 答：Document String即文档字符串（DocStrings），它是一个重要的工具，
#    用于解释文档程序，帮助你的程序文档更加简单易懂。
#    可以在函数体的第一行使用一对三个单引号'''或者一对三个双引号"""来定义文档字符串。
#    也可以使用__doc__调用函数中的文档字符串属性。

# packing和unpacking是什么？有什么用？
# 答：packing：打包
#    unpacking：解包

# global关键字的用途
# 答：当内部作用域想修改外部作用域的变量时，就需要用到global关键字来定义全局变量。

# locals函数的用途
# 答：locals()函数会以字典类型返回当前位置的全部局部变量。
#    对于函数，方法，lambda表达式，类，以及实现了__call__方法的类实例，它都返回True。

# python函数传递的方式
# 答：从动态类型看函数的参数传递，本质上传递的是引用
#    （传递不可变对象：对参数的操作不会影响引用。传递可变对象：改变函数参数，有可能改变原对象。）

# 什么是lambda函数？它有什么好处？
# 答：lambda函数是匿名函数，它在创建时不需要命名。
#    匿名函数有一个限制，就是只能有一个表达式，不用写return，返回值就是该表达式的结果
#    好处：实现起来非常简单；当我们在传入函数时，不需要显示地定义函数，直接传入匿名函数更方便。

# 写出4个python的常用内置函数，并描述它们的具体含义
# input(),print()：输入输出函数
# id()：求内存地址
# len()：求长度
# sum()：求和


# ***************第2题：递归函数、匿名函数***************
# 递归函数：
# 用递归实现fab：:[F(n)=F(n-1)+F(n-2),n>=3]
# 编写好文档注释

# def fab_func(n): # 定义函数
#     if n==1:
#         return 1
#     elif n==2:
#         return 1
#     return fab_func(n-1) + fab_func(n-2) # 由fab表达式可得
# print(fab_func(4))

# 匿名函数
# 接收参数身高、体重
# 使用匿名函数定义bmi
# bmi = lambda s,w: w/s**2
# print(bmi(1.83,68))

# ***************第3题：用户密码复杂度验证***************
# 用户密码复杂度验证（封装成函数）
# 长度超过8位（必须）                                 +1分
# 包括大、小写字母，数字，其他符号，以上四种至少三种    +1分
# 不能有长度超过或等于3的子串重复                     +1分
# 密码的评分等级，默认2分，以上条件满足一条加1分
# 返回密码的评分等级，及要改进的点：
# 如return 3，['长度小于8','密码没有由3种以上字符组成']

passwd = input("请输入密码：")
grade = 2
advice = []

# 密码长度判断
def passwd_judge1(passwd:str,grade):
    if len(passwd) < 8:
        advice.append("你的密码长度小于8，请重试！")
    else:
        grade += 1
    return grade

# 数字、字母、特殊字符的判断
result = [0,0,0,0]
def passwd_judge2(passwd:str):
    for i in passwd:
        if sum(result) >= 3:
            break
        else:
            if i.isupper():
                result[0] = 1
            elif i.islower():
                result[1] = 1
            elif i.isdigit():
                result[2] = 1
            else:
                result[3] = 1
    return result

# 重复子串的判断
def passwd_judge3():
    global grade1
    grade1 = 0
    for a in range(len(passwd)):
        if passwd.count(passwd[a:a+3]) >=2:
            advice.append("你的密码有长度超过或等于3的子串重复！")
            break
        else:
            grade1 = 1
    return grade1

grade = passwd_judge1(passwd,grade)
grade1 = passwd_judge3()
grade += grade1
# if grade1 == 1:
#     grade += 1
result = passwd_judge2(passwd)
if sum(result) < 3:
    info = ["你的密码需要包括大、小写字母，数字，其它符号，以上四种至少三种"]
    print(grade,advice+info)
else:
    grade += 1
#print(grade,advice)
